//TIP 要<b>运行</b>代码，请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
//TIP 要<b>运行</b>代码，请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
package com.rjgz.pro_one;

import java.util.HashSet;
import java.util.Random;
public class Main {
    public static void main(String[] args) {
        //打印提示语
        printHeader();
        //generateEquations生成习题并返回习题的答案数组
        int[] answerArr = generateEquations(50,5);//生成50个题目，并以每行5个展示
        //输出答案
        printAnswer(answerArr,5);
    }

    private static int[] generateEquations(int equationNum,int row) {
        //left_data为加法左边的数，right_data为右边的，flag是01标识用来判断+-
        //subCount为题目个数 answer为每题答案 signal为加减法符号 answerArr为答案数组
        int left_data, right_data, answer, flag, subCount = 0;
        char signal;//+或者-
        int[] answerArr=new int[equationNum];//存储答案
        HashSet equationsSet = new HashSet();//存储算式，可以去掉重复的式子
        int column = equationNum/row;//列数=总数/行数
        Random random = new Random();
        while (subCount!=equationNum) {
            flag = random.nextInt(2);//随机生成0或1
            left_data = random.nextInt(101);//随机生成[0~100]之间的数
            right_data = random.nextInt(101);//随机生成[0~100]之间的数
            //判断是0或1生成加法或者减法，1为加法
            if (flag == 1) {
                signal = '+';
            } else {
                signal = '-';
            }
            equationsSet.add(left_data+""+signal+""+right_data);
            //100以内的加减法，且结果也不能超过100，不能是负数，因此要加上判断，answer为计算结果
            answer = calculate(left_data, right_data, flag);//调用计算函数
            if (answer < 100&&answer > 0 ) {
                subCount++;
                //将答案存入数组中并打印题目
                answerArr[subCount-1] = answer;
                if(left_data<10||right_data<10){ //为了美观
                    System.out.print(" ");
                }else if(left_data<10&&right_data<10) {
                    System.out.print("  ");
                }
                System.out.print(left_data +""+ signal + ""+right_data + "=\t");
                if(subCount%row==0){//row行就换行
                    System.out.print("\n");
                }
            }else {
                equationsSet.remove(left_data+""+signal+""+right_data);//如果结果不合法则删除Hashset中不合法的数据
            }
        }
        System.out.println("共"+equationsSet.size()+"道计算题");
        return answerArr;
    }

    private static void printHeader() {
        System.out.println("---------------------------------------");
        System.out.println("--- 程序输出50道100以内的加减法算式的习题 ");
        System.out.println("--- 每次运行程序可得到一套50道题的习题和答案 ");
        System.out.println("---------------------------------------");
    }

    /**
     * 获取计算结果并返回
     * @param left
     * @param right
     * @param flag
     * @return
     */
    public static int calculate(int left, int right, int flag) {
        if (flag == 1) {
            return left+right;
        }
        return left-right;
    }

    /**
     * 打印出数组中存放的计算结果
     * @param answerArr
     */
    public static void printAnswer(int[] answerArr,int row){
        System.out.println("-------------------------------");
        System.out.println("--- 下面是习题的参考答案");
        System.out.println("-------------------------------");
        //答案数组遍历输出
        for (int i = 0; i < answerArr.length; i++) {
            if((i+1)<10){//为了美观
                System.out.print(" ");
            }
            System.out.print((i+1)+": "+answerArr[i]+"\t");
            if((i+1)%row==0){//row行就换行
                System.out.print("\n");
            }

        }
    }

}